#ifndef ESP32_LIVE_STREAM_H
#define ESP32_LIVE_STREAM_H

#include <string>
#include <thread>
#include <memory>
#include <esp_timer.h>

// 前向声明
struct cJSON;

class Esp32LiveStream {
private:
    std::string stream_url_;
    std::string stream_token_;
    bool streaming_ = false;
    std::thread stream_thread_;
    
    // 聊天数据获取相关
    bool is_fetching_chat_ = false;
    esp_timer_handle_t chat_timer_ = nullptr;
    bool has_fetched_in_current_listening_ = false;  // 当前聆听状态下是否已经获取过数据
    bool has_fetched_in_current_idle_ = false;      // 当前空闲状态下是否已经获取过数据
    
    // 重试机制相关
    int retry_count_ = 0;                           // 当前重试次数
    static const int MAX_RETRIES = 2;               // 最大重试次数
    
    static const int CHAT_FETCH_INTERVAL_MS = 1000;  // 1秒间隔

public:
    Esp32LiveStream();
    ~Esp32LiveStream();

    // 设置直播流配置
    void SetStreamConfig(const std::string& url, const std::string& token);
    
    // 开始直播
    bool StartStream(const std::string& stream_id);
    
    // 停止直播
    bool StopStream();
    
    // 获取直播状态
    bool IsStreaming() const { return streaming_; }
    
    // 获取直播信息
    std::string GetStreamInfo() const;
    
    // 获取直播间聊天数据
    std::string FetchChatData();
    
    // 开始获取聊天数据（使用定时器）
    bool StartFetchingChatData();
    
    // 停止获取聊天数据
    bool StopFetchingChatData();
    
    // 定时器回调函数
    static void ChatTimerCallback(void* arg);
    
    // 处理聊天数据中的音频，返回是否成功找到音频数据
    bool ProcessChatAudioData(const std::string& json_response);
    
    // 处理单个音频数据包
    bool ProcessSingleAudioPacket(cJSON* audio_data_array);
    
    // 处理聊天数据用于唤醒词
    void ProcessChatForWakeWord(const std::string& json_response);
};

#endif // ESP32_LIVE_STREAM_H 